/**
 * 
 */
package br.com.skynix.tcmc.model.oportunidade;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.skynix.tcmc.base.model.EntidadeAuditavel;
import br.com.skynix.tcmc.model.conta.Conta;
import br.com.skynix.tcmc.model.rh.Empresa;
import br.com.skynix.tcmc.model.rh.Funcionario;

/**
 * @author davi
 * 
 */
@Entity
@Table(name = "tb_oportunidade")
public class Oportunidade extends EntidadeAuditavel {
	@ManyToOne
	@JoinColumn(name = "id_origem_oportunidade_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK001_oportunidade")
	private OrigemOportunidade origemOportunidade;

	@ManyToOne
	@JoinColumn(name = "id_tipo_oportunidade_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK002_oportunidade")
	private TipoOportunidade tipoOportunidade;

	@ManyToOne
	@JoinColumn(name = "id_campanha_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK003_oportunidade")
	private Campanha campanha;

	@NotNull
	@ManyToOne
	@JoinColumn(name = "id_fase_oportunidade_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK004_oportunidade")
	private FaseOportunidade faseOportunidade;

	@NotNull
	@ManyToOne
	@JoinColumn(name = "id_conta_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK005_oportunidade")
	private Conta conta;

	@NotNull
	@ManyToOne
	@JoinColumn(name = "id_supervisor_telemarketing_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK006_oportunidade")
	private Funcionario supervisorTelemarketing;

	@ManyToOne
	@JoinColumn(name = "id_telemarketing_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK007_oportunidade")
	private Funcionario telemarketing;

	@ManyToOne
	@JoinColumn(name = "id_supervisor_vendas_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK008_oportunidade")
	private Funcionario supervisorVendas;

	@ManyToOne
	@JoinColumn(name = "id_consultor_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK009_oportunidade")
	private Funcionario consultor;

	@NotNull
	@ManyToOne
	@JoinColumn(name = "id_empresa_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK010_oportunidade")
	private Empresa empresa;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String descricao;

	@Column(nullable = true, precision = 15, scale = 2)
	private BigDecimal probabilidade;

	@Column(nullable = true, precision = 15, scale = 2)
	private BigDecimal valor;

	@Column(name = "data_fechamento", nullable = true)
	private Timestamp dataFechamento;

	@Column(nullable = true, columnDefinition = "TEXT DEFAULT NULL")
	private String observacao;

	@ManyToMany
	@JoinTable(name = "tb_conta_x_oportunidade", joinColumns = @JoinColumn(
			name = "id_conta_fk", referencedColumnName = "id",
			nullable = false, table = "tb_conta"),
			inverseJoinColumns = @JoinColumn(name = "id_oportunidade_fk",
					referencedColumnName = "id", nullable = false,
					table = "tb_oportunidade"))
	private Set<Conta> contas;

	/**
	 * @return the origemOportunidade
	 */
	public OrigemOportunidade getOrigemOportunidade() {
		return origemOportunidade;
	}

	/**
	 * @param origemOportunidade the origemOportunidade to set
	 */
	public void setOrigemOportunidade(OrigemOportunidade origemOportunidade) {
		this.origemOportunidade = origemOportunidade;
	}

	/**
	 * @return the tipoOportunidade
	 */
	public TipoOportunidade getTipoOportunidade() {
		return tipoOportunidade;
	}

	/**
	 * @param tipoOportunidade the tipoOportunidade to set
	 */
	public void setTipoOportunidade(TipoOportunidade tipoOportunidade) {
		this.tipoOportunidade = tipoOportunidade;
	}

	/**
	 * @return the campanha
	 */
	public Campanha getCampanha() {
		return campanha;
	}

	/**
	 * @param campanha the campanha to set
	 */
	public void setCampanha(Campanha campanha) {
		this.campanha = campanha;
	}

	/**
	 * @return the faseOportunidade
	 */
	public FaseOportunidade getFaseOportunidade() {
		return faseOportunidade;
	}

	/**
	 * @param faseOportunidade the faseOportunidade to set
	 */
	public void setFaseOportunidade(FaseOportunidade faseOportunidade) {
		this.faseOportunidade = faseOportunidade;
	}

	/**
	 * @return the conta
	 */
	public Conta getConta() {
		return conta;
	}

	/**
	 * @param conta the conta to set
	 */
	public void setConta(Conta conta) {
		this.conta = conta;
	}

	/**
	 * @return the supervisorTelemarketing
	 */
	public Funcionario getSupervisorTelemarketing() {
		return supervisorTelemarketing;
	}

	/**
	 * @param supervisorTelemarketing the supervisorTelemarketing to set
	 */
	public void setSupervisorTelemarketing(Funcionario supervisorTelemarketing) {
		this.supervisorTelemarketing = supervisorTelemarketing;
	}

	/**
	 * @return the telemarketing
	 */
	public Funcionario getTelemarketing() {
		return telemarketing;
	}

	/**
	 * @param telemarketing the telemarketing to set
	 */
	public void setTelemarketing(Funcionario telemarketing) {
		this.telemarketing = telemarketing;
	}

	/**
	 * @return the supervisorVendas
	 */
	public Funcionario getSupervisorVendas() {
		return supervisorVendas;
	}

	/**
	 * @param supervisorVendas the supervisorVendas to set
	 */
	public void setSupervisorVendas(Funcionario supervisorVendas) {
		this.supervisorVendas = supervisorVendas;
	}

	/**
	 * @return the consultor
	 */
	public Funcionario getConsultor() {
		return consultor;
	}

	/**
	 * @param consultor the consultor to set
	 */
	public void setConsultor(Funcionario consultor) {
		this.consultor = consultor;
	}

	/**
	 * @return the empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	/**
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}

	/**
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	/**
	 * @return the probabilidade
	 */
	public BigDecimal getProbabilidade() {
		return probabilidade;
	}

	/**
	 * @param probabilidade the probabilidade to set
	 */
	public void setProbabilidade(BigDecimal probabilidade) {
		this.probabilidade = probabilidade;
	}

	/**
	 * @return the valor
	 */
	public BigDecimal getValor() {
		return valor;
	}

	/**
	 * @param valor the valor to set
	 */
	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	/**
	 * @return the dataFechamento
	 */
	public Timestamp getDataFechamento() {
		return dataFechamento;
	}

	/**
	 * @param dataFechamento the dataFechamento to set
	 */
	public void setDataFechamento(Timestamp dataFechamento) {
		this.dataFechamento = dataFechamento;
	}

	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}

	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	/**
	 * @return the contas
	 */
	public Set<Conta> getContas() {
		return contas;
	}

	/**
	 * @param contas the contas to set
	 */
	public void setContas(Set<Conta> contas) {
		this.contas = contas;
	}
}
